import { NextRequest, NextResponse } from "next/server"; import { and, eq } from "drizzle-orm"; import { db } from "@/db/client"; import { listingMedia } from "@/db/schema"; import { assertSameOrigin, requireUser } from "@/lib/auth/session"; import { getListingFull, assertOwner } from "@/lib/listings/service"; import { removeFiles } from "@/lib/listings/media"; import { apiError, handle } from "@/lib/api"; import { audit } from "@/lib/auth/audit"; export const dynamic = "force-dynamic"; export async function DELETE(_req: NextRequest, { params }: { params: Promise<{ id: string; mediaId: string }> }) { try { await assertSameOrigin(); const u = await requireUser(); const { id, mediaId } = await params; const l = await getListingFull(id); if (!l) return apiError(404, "not_found", "Annonce introuvable"); assertOwner(l, u.id, u.roles); const [m] = await db().select().from(listingMedia).where(and(eq(listingMedia.id, mediaId), eq(listingMedia.listingId, id))).limit(1); if (!m) return apiError(404, "not_found", "Média introuvable"); await db().update(listingMedia).set({ status: "DELETED" }).where(eq(listingMedia.id, mediaId)); if (!m.storageKey.startsWith("pending/")) removeFiles(m.storageKey); await audit("media.delete", { actorId: u.id, objectType: "listing_media", objectId: mediaId }); return NextResponse.json({ ok: true }); } catch (e) { return handle(e); } }